跳到主要内容

音频(以 ALC5640 为例)

本文档以 Realtek ALC5640 为例,说明其在NG4520 平台上的驱动适配、设备树配置、内核配置、系统加载及常用测试方法。

Audio 架构与名词解释

ModuleComponent
I2SI2S 接口,用于数字音频数据的传输,用于连接外部音频设备。
DSPK数字扬声器接口,用于连接和控制数字扬声器,支持数字扬声器。
DMIC数字麦克风控制器,用于管理和处理数字麦克风输入,支持数字麦克风。
Mixer混音器,用于将多个音频信号混合成一个输出信号。
AMX音频多路复用器,用于将多个音频信号复用到一个输出通道。
ADX音频解复用器,用于将一个音频信号分离成多个通道。
SFC采样频率转换器,用于将音频信号转换到不同的采样频率。
MVC主音量控制器,用于调节音频信号的主音量。
ADMA音频直接内存访问,用于高效传输音频数据,支持 32 通道。
ADMAIFAHUB DMA 接口,用于音频硬件单元与内存之间的数据传输,支持 20 个 TX/RX 通道,专为 Jetson 设计,支持多通道音频数据传输。
XBAR交叉开关(音频路由),用于在多个音频信号源和目标之间动态路由音频数据,是音频数据路由的核心模块,支持动态音频路径配置。
APENVIDIA Jetson 设备中的独立硬件模块,专门用于音频处理,具有低功耗和高性能的特点。
AHUBAPE 的核心组件,负责音频数据的路由和处理,包含多个 NVIDIA 独有的硬件模块。

Audio 软件架构说明

  • ALSA ASoC(Audio System on Chip)为主线 Linux 音频子系统,管理嵌入式音频硬件。
  • ASoC 架构包含三大核心组件:
    1. Codec 驱动:管理 ALC5640 寄存器及音频路径
    2. 平台驱动:处理 Tegra DMA、I2S 接口
    3. 机器驱动:绑定硬件、定义音频路由
  • NVIDIA 独有特性:APE、AHUB(含 XBAR 动态路由和 ADMAIF 多通道 DMA)

ALC5640 驱动适配流程

前置条件

  • 确认Codec ALC5640芯片 i2c地址

  • 根据数据手册获取ALC5640模式(主/从模式)、时钟(如MCLK/BCLK/LRCK)

设备树配置

在设备树中Linux_for_Tegra/source/hardware/nvidia/t23x/nv-public/nv-platform/tegra234-NG45XX-p3768-0000+p3767-0000-common.dts完成下述配置

  • i2c节点配置,添加codec芯片配置,参考如下:

    i2c@3160000 {
    status = "okay";

    rt5640: audio-codec@1c {
    status = "okay";
    compatible = "realtek,rt5640";
    reg = <0x1c>;
    interrupt-parent = <&gpio>;
    interrupts = <TEGRA234_MAIN_GPIO(P, 6) 0>;
    clocks = <&bpmp TEGRA234_CLK_AUD_MCLK>;
    clock-names = "mclk";

    realtek,dmic1-data-pin = <RT5640_DMIC1_DATA_PIN_NONE>;
    realtek,dmic2-data-pin = <RT5640_DMIC2_DATA_PIN_NONE>;
    realtek,jack-detect-source = <RT5640_JD_SRC_HDA_HEADER>;

    sound-name-prefix = "CVB-RT";
    sel_jd_source = <3>;

    port {
    rt5640_ep: endpoint {
    remote-endpoint = <&i2s4_dap>;
    mclk-fs = <256>;
    };
    };
    };
    };
  • I2S节点配置,使能ahub,i2s控制器,并且连接 r&t5640_ep codec芯片,参考如下:

    aconnect@2900000 {
    status = "okay";
    ahub@2900800 {
    status = "okay";
    i2s@2901300 {
    status = "okay";
    ports {
    port@1 {
    endpoint {
    dai-format = "i2s";
    remote-endpoint = <&rt5640_ep>;
    };
    };
    };
    };
    };
    };
  • 声卡节点定义&路由配置,配置如下:

    sound {
    status = "okay";
    compatible = "nvidia,tegra186-audio-graph-card",
    "nvidia,tegra186-ape";
    nvidia-audio-card,mclk-fs = <256>;
    label = "NVIDIA Jetson Orin Nano APE";

    nvidia-audio-card,widgets =
    "Headphone", "CVB-RT Headphone Jack",
    "Microphone", "CVB-RT Mic Jack",
    "Speaker", "CVB-RT Int Spk",
    "Microphone", "CVB-RT Int Mic";

    nvidia-audio-card,routing =
    "CVB-RT Headphone Jack", "CVB-RT HPOL",
    "CVB-RT Headphone Jack", "CVB-RT HPOR",
    "CVB-RT Headphone Jack", "CVB-RT LOUTL",
    "CVB-RT Headphone Jack", "CVB-RT LOUTR",
    "CVB-RT IN1P", "CVB-RT Mic Jack",
    "CVB-RT IN2P", "CVB-RT Mic Jack",
    "CVB-RT IN3P", "CVB-RT Mic Jack",
    "CVB-RT Int Spk", "CVB-RT SPOLP",
    "CVB-RT Int Spk", "CVB-RT SPORP",
    "CVB-RT DMIC1", "CVB-RT Int Mic",
    "CVB-RT DMIC2", "CVB-RT Int Mic";
    };
  • DAI链路配置,链接CPU ADMA中转xbar连接到codec alc5640。

    nvidia-audio-card,dai-link@79 {
    link-name = "rt5640-playback";

    codec {
    sound-dai = <&rt5640 0>;
    prefix = "CVB-RT";
    };
    };

内核配置

Linux_for_Tegra/source/kernel/kernel-jammy-src/arch/arm64/configs/defconfig中,添加下述配置

CONFIG_SND_SOC_ALC5640=m

系统适配与加载

  • 启动设备,将编译生成的dtb和snd-soc-rt5640.ko拷贝通过scp拷贝到AIBOX上。
cd Linux_for_Tegra/source

scp ./kernel-devicetree/generic-dts/dtbs/tegra234-NG45XX-p3768-0000+p3767-0003-nv-super.dtb milesight@192.168.60.3:/home/milesight
scp ./kernel/kernel-jammy-src/sound/soc/codecs/snd-soc-rt5640.ko milesight@192.168.60.3:/home/milesight
  • 拷贝snd-soc-rt5640.ko到modules目录下,并执行depmod加载驱动
sudo cp ./snd-soc-rt5640.ko /lib/modules/5.15.148-tegra/kernel/sound/soc/codecs/snd-soc-rt5640.ko

sudo depmod
  • 完成后,重启开发板即可。

测试验证

  • 耳机扬声器播放
amixer -c APE cset name="I2S4 Mux" "ADMAIF1"

amixer -c APE cset name="CVB-RT DAC MIXL INF1 Switch" "on"
amixer -c APE cset name="CVB-RT DAC MIXR INF1 Switch" "on"
amixer -c APE cset name="CVB-RT Stereo DAC MIXL DAC L1 Switch" "on"
amixer -c APE cset name="CVB-RT Stereo DAC MIXR DAC R1 Switch" "on"

amixer -c APE cset name="CVB-RT HPO MIX DAC1 Switch" "on"
amixer -c APE cset name="CVB-RT HP L Playback Switch" "on"
amixer -c APE cset name="CVB-RT HP R Playback Switch" "on"
amixer -c APE cset name="CVB-RT HP Playback Volume" "31,31"
amixer -c APE cset name="CVB-RT DAC1 Playback Volume" "175,175"

#测试
aplay xxx.wav
  • 耳机麦克风录音
amixer -c APE cset name="I2S4 Mux" "ADMAIF1"
amixer -c APE cset name="CVB-RT IN1 Boost" 8
amixer -c APE cset name="CVB-RT RECMIXL BST1 Switch" "on"
amixer -c APE cset name="CVB-RT RECMIXR BST1 Switch" "on"
amixer -c APE cset name="CVB-RT Stereo ADC1 Mux" "ADC"
amixer -c APE cset name="CVB-RT Stereo ADC MIXL ADC1 Switch" "on"
amixer -c APE cset name="CVB-RT Stereo ADC MIXR ADC1 Switch" "on"
amixer -c APE cset name='CVB-RT ADC Capture Switch' on

#测试,录音播放
arecord -Dhw:APE,1 -c 2 -r 44100 -f S16_LE -d 5 xxx.wav
aplay xxx.wav
  • 外置扬声器播放
amixer -c APE cset name="I2S4 Mux" "ADMAIF1"

amixer -c APE cset name="CVB-RT Speaker Channel Switch" on
amixer -c APE cset name="CVB-RT Speaker L Playback Switch" on
amixer -c APE cset name="CVB-RT Speaker R Playback Switch" on

amixer -c APE cset name="CVB-RT Speaker Playback Volume" 50%
amixer -c APE cset name="CVB-RT DAC1 Playback Volume" "175,175"

amixer -c APE cset name="CVB-RT DAC MIXL INF1 Switch" on
amixer -c APE cset name="CVB-RT DAC MIXR INF1 Switch" on
amixer -c APE cset name="CVB-RT SPK MIXL DAC L1 Switch" on
amixer -c APE cset name="CVB-RT SPK MIXR DAC R1 Switch" on

amixer -c APE cset name="CVB-RT SPOL MIX SPKVOL L Switch" on
amixer -c APE cset name="CVB-RT SPOR MIX SPKVOL R Switch" on
amixer -c APE cset name="CVB-RT OUT MIXL SPK MIXL Switch" on
amixer -c APE cset name="CVB-RT OUT MIXR SPK MIXR Switch" on

#测试
aplay xxx.wav
  • 外置麦克风录音
amixer -c APE cset name="I2S4 Mux" "ADMAIF1"

amixer -c APE cset name="CVB-RT IN2 Boost" 8
amixer -c APE cset name="CVB-RT IN3 Boost" 8
amixer -c APE cset name="CVB-RT RECMIXL BST2 Switch" "on"
amixer -c APE cset name="CVB-RT RECMIXR BST2 Switch" "on"
amixer -c APE cset name="CVB-RT RECMIXL BST3 Switch" "on"
amixer -c APE cset name="CVB-RT RECMIXR BST3 Switch" "on"
amixer -c APE cset name='CVB-RT ADC Capture Switch' on

#测试,录音播放
arecord -Dhw:APE,1 -c 2 -r 44100 -f S16_LE -d 5 xxx.wav
aplay xxx.wav

故障排查

  • 无声音输出

    • 确认MCLK/BCLK正常

    • 确认I2S

    • 检查amixer路由配置

  • 录音噪声大

    • 检查采样率

参考

Audio Setup and Development — NVIDIA Jetson Linux Developer Guide


如需适配其它音频编解码器,流程基本一致,重点关注 codec 驱动支持及设备树参数配置。